/**
 * @param {number} k 0 ~ 1 时间
 */
function quinticOut(k) {
	return --k * k * k * k * k + 1;
}

/**
 * @param {number} k 0 ~ 1 时间
 */
function quinticIn(k) {
	return k * k * k * k * k;
}

/**
 * @param {number} k 0 ~ 1 时间
 */
function cubicOut(k) {
	return --k * k * k + 1;
}

function cubicIn(k) {
	return k * k * k;
}

function cubicInOut(k) {
	if ((k *= 2) < 1) {
		return 0.5 * k * k * k;
	}
	return 0.5 * ((k -= 2) * k * k + 2);
}

function linear(k) {
	return k;
}

function delay(k) {
	return k >= 1 ? 1 : 0;
}

function hold(k) {
	return k <= 0 ? 0 : 1;
}

/**
 * 计算当前的 value
 * @param {number} start 起始值
 * @param {number} end 终值
 * @param {number} delta 进度, 0~1
 * @param {function} func 缓动函数
 */
function calc(start, end, delta, func = linear) {
	if (delta <= 0) return start;
	if (delta >= 1) return end;
	let process = func(delta);
	return start + (end - start) * process;
}

export {
	quinticOut, quinticIn, cubicOut, cubicIn, cubicInOut,
	linear, delay, hold,
	calc
};